package demo.mqserver.core;

import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

//一个要传递的消息
//此处的 Message 对象，需要能够在网络上传输，并且也能写入到文件中
//需要针对 Message 进行序列化和反序列化
@Data
public class Message implements Serializable {

    //核心属性
    private BasicProperties basicProperties = new BasicProperties();

    private byte[] body;

    //辅助属性
    //message 后续会存储到文件中（持久化）
    //  [offsetBeg,offsetEnd)
    //这两个属性不需要被序列化保存到文件中  消息写入到文件中，所在位置就固定了，不需要单独存储
    //为了让内存中的 Message 对象，能够快速找到对应硬盘上的 Message 的位置
    private transient long offsetBeg = 0;  //消息数据的开头距离文件开头的位置偏移（字节）

    private transient long offsetEnd = 0;  //数据消息的结尾距离文件开头的位置偏移（字节）

    //是否是有效消息（针对文件中的消息，逻辑删除）
    //  0x1 表示有效    0x0 表示无效
    private byte isValid = 0x1;


    //创建一个工厂方法，封装创建 Message 对象的过程
    //这个方法中创建的 Message 对象，会自动生成唯一的 MessageId
    public static Message createMessageWithId(String routingKey, BasicProperties basicProperties, byte[] body){
        Message message = new Message();
        if(basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        //此处生成的 MessageId 以 M- 为前缀
        message.basicProperties.setMessageId("M-" + UUID.randomUUID());
        //routingKey 和 basicProperties 里面的 routingKey 冲突，以外面的为主
        message.basicProperties.setRoutingKey(routingKey);
        message.body = body;
        //offsetBeg 和 offsetEnd isValid 是消息持久化时用到的，在把消息写入到文件之前再进行设定
        //此处只是在内存中创建一个 Message 对象
        return message;
    }


    public String getMessageId(){
        return basicProperties.getMessageId();
    }
    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }
    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }

    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }
    public void setDeliverMode(int mode){
        basicProperties.setDeliverMode(mode);
    }
}
